#include "trabalho.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

char * strtolower(char *string)
{
	char *cp;

	cp = string;
	while(*cp)
	{
		*cp = tolower(*cp);
		cp++;
	}
	
	return(string);
}

void printPessoa(pessoa *p)
{
	fprintf(stderr, "%d;%s;%s;%s\n", p->index, p->nome, p->cidade, p->telefone);
}

void printLista(lista *l)
{
	int i;
	pessoa pt;
	
	i = 0;
	
	fprintf(stderr, "Lista com: %d elementos.\n\n", l->size);
	
	for(i = 0; i < l->size; i++)
	{
		pt = l->p[i];
		printPessoa(&pt);
	}
}

void parsePessoa(pessoa *p, char *buffer)
{
	char delims[] = ";";
	char *result = NULL;
	
	result = strtok( buffer, delims );
	p->index = atoi(result);
	
	result = strtok( NULL, delims );
	strcpy(p->nome, result);
	
	result = strtok( NULL, delims );
	strcpy(p->cidade, result);
	
	result = strtok( NULL, delims );
	strcpy(p->telefone, result);
}

void loadPessoas(lista *l)
{
	FILE *fp;
	char file_buffer[1024];
	int i;
	pessoa pt;
	
	i = 0;
	fp = fopen("pessoas.txt", "r");
	
	if( fp != NULL )
	{
		while( fscanf(fp, "%s", file_buffer) > 0 )
		{
			parsePessoa(&pt, file_buffer);
			l->p[i] = pt;
			i++;
		}
		
		fclose(fp);
	}
	
	l->size = i;
}

void gravaPessoaNoArquivo(pessoa *p)
{
	FILE *arq;
	lista l;
	
	int next;
	
	loadPessoas(&l);
	next = l.size;
	//int next = 100;
	
	arq = fopen("pessoas.txt", "a+");
	
	fprintf(arq, "%d;%s;%s;%s\n", next, p->nome, p->cidade, p->telefone);
	
	fclose(arq);
}

void excluirPessoa(int index)
{
	int i, j, errno;
	lista l, l2;
	loadPessoas(&l);
	
	errno = remove("pessoas.txt");
	if(errno == 0)
	{
		j = 0;
		for(i = 0; i < l.size; i++)
		{
			if( i != index )
			{
				l2.p[j] = l.p[i];
				j++;
			}
		}
		
		l2.size = j;
		
		for(j = 0; j < l2.size; j++)
		{
			gravaPessoaNoArquivo(&l2.p[j]);
		}
	}
}

void editarPessoa(pessoa p)
{
	int i, errno;
	lista l;
	loadPessoas(&l);
	
	errno = remove("pessoas.txt");
	if(errno == 0)
	{
		for(i = 0; i < l.size; i++)
		{
			if( i == p.index )
			{
				l.p[i] = p;
				break;
			}
		}
		
		for(i = 0; i < l.size; i++)
		{
			gravaPessoaNoArquivo(&l.p[i]);
		}
	}
}

void buscarPessoas(lista *l, char *busca)
{
	FILE *fp;
	char file_buffer[1024];
	char *pch;
	int i, isExcluido;
	pessoa pt;
	
	fp = fopen("pessoas.txt", "r");
	
	i = 0;
	while( fscanf(fp, "%s", file_buffer) > 0 )
	{
				
		parsePessoa(&pt, file_buffer);
		
		pch = strstr(pt.nome, busca);
		if(pch != NULL)
		{
			l->p[i] = pt;
			i++;
		}
	}
	
	fclose(fp);
	
	l->size = i;
}

void ordenarLista(lista *l)
{
	int i, j;
	pessoa pt;
	char buff1[32];
	char buff2[32];
	
	for(i = 0; i < l->size; i++)
	{
		for(j = 0; j < l->size; j++)
		{
			strcpy(buff1, l->p[i].nome);
			strtolower(buff1);
			
			strcpy(buff2, l->p[j].nome);
			strtolower(buff2);
			
			if(strcmp(buff1, buff2) < 0)
			{
				pt = l->p[i];
				l->p[i] = l->p[j];
				l->p[j] = pt;
			}
		}
	}
}

int * cadastra_0_svc(pessoa *argp, struct svc_req *rqstp)
{
	static int result;
	
	gravaPessoaNoArquivo(argp);
	fprintf(stderr, "%s - %s - %s", argp->nome, argp->cidade, argp->telefone);
	
	result = 1;
	return &result;
}

int * excluir_0_svc(int *index, struct svc_req *rqstp)
{
	static int result;
	
	excluirPessoa(*index);
	
	result = 1;
	return &result;
}

int * editar_0_svc(pessoa *p, struct svc_req *rqstp)
{
	static int result;
	
	editarPessoa(*p);
	
	result = 1;
	return &result;
}

lista * listar_0_svc(int *linha, struct svc_req *rqstp)
{
	static lista l;
	loadPessoas(&l);
	ordenarLista(&l);
	return &l;
}

lista * consultapessoa_0_svc(texto *oque, struct svc_req *rqstp)
{
	static lista lr;
	int i, j, exists;
	lista l;
	pessoa pt, p;
	char *f;
	
	char *busca = oque->value;
	exists = 0;
	
	loadPessoas(&l);
	j = 0;
	for(i = 0; i < l.size; i++)
	{
		pt = l.p[i];
		f = strstr( strtolower(pt.nome), strtolower(busca) );
		//fprintf(stderr, "%s==%s\n", pt.nome, busca);
		//printPessoa(&pt);
		if(f)
		{
			lr.p[j] = l.p[i];
			j++;
			
			//fprintf(stderr, "Entrou\n");
			
			exists = 1;
		}
	}
	lr.size = j;
	
	if(exists == 0)
	{
		p.index = -1;
		strcpy(p.nome, "Nao foi encontrado");
		strcpy(p.cidade, "-");
		strcpy(p.telefone, "-");
		lr.p[0] = p;
		lr.size = 1;
	}
	return &lr;
}

int * printteste_0_svc(texto *oque, struct svc_req *rqstp)
{
	static int result;
	
	fprintf(stderr, "%s\n", oque->value);
	
	result = 1;
	return &result;
}


